package com.huanzhidadi.singleweb.pageinfo.util;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
public class PageInfoUtil {
    /**
     * pageInfo泛型转换
     *
     * @param pageInfoE pageInfo<E>类对象
     * @param dClz      DTO类的class对象
     * @param <E>       entity类
     * @param <D>       DTO类
     * @return
     */
    public static <E, D> PageInfo<D> pageInfo2Entity(PageInfo<E> pageInfoE, Class<D> dClz) {
        //创建page对象，传入当前页，和每页数量进行初始化（page对象是ArrayList的子类，在ArrayList的基础上添加了分页的信息）
        Page<D> page = new Page<>(pageInfoE.getPageNum(), pageInfoE.getPageSize());
        //传入总记录数
        page.setTotal(pageInfoE.getTotal());

        /* 优化1 把dClz.getConstructor()从循环中提取出来
        Constructor<D> constructor = null;
        try {
            constructor = dClz.getConstructor();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        //遍历原entity的列表
        for (E e : pageInfoE.getList()) {
            try {
                //通过class生成目标数据类型的对象
                D d = constructor.newInstance();
                //使用BeanUtils将entity中与dto相同的属性拷贝到dto中并放入page列表
                BeanUtils.copyProperties(e, d);
                page.add(d);
                // page.add(BeanCopyUtil.copy(e, dClz));
            } catch (Exception ex) {
                log.error("pageInfo泛型转换异常", ex);
            }
        }*/

        /* 优化2 使用BeanCopyUtil.copy()代替BeanUtils.copyProperties()，用lambda表达式替换for循环
            需要在pom文件中引入orika-core包
        */
        List<D> collect = pageInfoE.getList().stream().map(item -> BeanCopyUtil.copy(item, dClz)).
                collect(Collectors.toList());
        page.addAll(collect);

        //通过page对象以及pageInfoE中的导航页码数创建要返回的pageInfo<D>对象
        return new PageInfo<D>(page, pageInfoE.getNavigatePages());
    }
}
